package multi_thread.basic;

import java.util.concurrent.TimeUnit;

/**
 * Description: 通过继承 Thread类 来创建线程类。
 *
 * @author Cheng Jun
 * @version 1.0
 * @date 2019/10/28 17:01
 */
public class ThreadDebugExample {
    public static void main(String[] args) throws InterruptedException {
        // 线程名 可以自定义，可以相同
        MyDebugThread myThread = new MyDebugThread();
        MyDebugThread myThread1 = new MyDebugThread();
        MyDebugThread myThread2 = new MyDebugThread();
        myThread.start();
        myThread1.start();
        myThread2.start();
    }
}

/**
 * 通过继承 Thread 的方式，实现多线程;
 * https://blog.csdn.net/Yal_insist/article/details/123522423
 * All模式:
 * 所有的线程都要在当前位置被阻塞，谁先来就先阻塞谁，发生阻塞时其他的线程当前时刻执行到哪里就在哪里进行原地等待。
 * 如果此时按下一步F8，那所有的线程都通过阻塞代码
 * 如果此时按恢复程序运行F9，那么当前线程通过阻塞代码，等待下一个线程的到来，也是谁先来阻塞谁，发生阻塞时其他的线程当前时刻执行到哪里就在哪里进行原地等待。
 *
 * Thread模式:
 * 所有的线程都会运行到断点处然后阻塞如果此时按下一步F8，那当前的线程都通过阻塞代码，其他线程不动。
 * 如果此时按恢复程序运行F9，那么当前线程通过阻塞代码，并自动切换到下一个阻塞线程进行调试。
 */
class MyDebugThread extends Thread {

    @Override
    public void run() {
        // 断点的挂起,选择所有--表示针对所有线程,选择线程--表示针对单个线程.
        // 选择所有:F8的话,所有线程通过此断点,所有线程暂停,其他的线程当前时刻执行到哪里就在哪里进行原地等待
        // 选择线程:F8的话,当前线程通过此断点.所有线程阻塞在断点处.每个线程需要挨个F8通过.
        // 选择所有:F9的话,当前线程跳过此断点,下一个线程进入此断点,并且所有线程暂停,其他的线程(包括之前的线程)当前时刻执行到哪里就在哪里进行原地等待
        // 选择线程:F9的话,当前线程跳过此断点,下一个线程进入此断点,但是之前的线程会一直继续执行.
        // 选择所有和选择线程的区别:当前线程的调试是否暂停其它线程的执行.选择所有的话,会暂停;选择线程的话,不会暂停.
        Thread currentThread = Thread.currentThread();
        System.out.println(currentThread.getName() + "-------------进入");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(currentThread.getName() + "-------------离开");
        }
    }

}

